package itheima03;
import domain.Person;
import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author xxx
 * @date 2020/12/28 0:43
 * @description
 */
public class TestDemo {
    @Test
    public void  method() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
       //3种方法获得class对象
        Person person=new Person();
        Class c=person.getClass();
        System.out.println(c);
        //通过Person获得class对象
        Class b=Person.class;
        System.out.println(b);
        //通过class对象获取包名类名
        Class<?> h=Class.forName("domain.Person");
        System.out.println(h);

        System.out.println("------------");
        //获取所有构造方法
        Constructor[] constructor=c.getConstructors();
        for (Constructor constructor1 : constructor) {
            System.out.println(constructor1);
        }
        System.out.println("======");
        //获取public修饰的空参构造方法对象，并且执行空空参构造对象
        Constructor<Person> constructor1=c.getConstructor();
        System.out.println(constructor1);
        Person person1=constructor1.newInstance();
        System.out.println("我就是有参构造："+person1);
        //获取public修饰的第一个参数是String类型,第二个参数是int类型的构造方法对象，并且执行对象

        Constructor<Person> constructor2=c.getConstructor(String.class,int.class);
        System.out.println(constructor2);
        //获取public修饰的参数是int类型的构造方法对象
        Constructor<Person> constructor11=c.getConstructor(int.class);
        System.out.println(constructor11);
        System.out.println("121212");
        Person person2=constructor11.newInstance(20);
        System.out.println(person2);

        //获取该类中所有public修饰的所有的构造方法
        //获取public修饰的名称为toString的没有参数的方法
        Method method=c.getMethod("toString");
        System.out.println(method);
        // 获取public修饰的名称为setName的参数为String类型的方法
        Method method1=c.getMethod("setName", String.class);
        System.out.println(method1);
        // 获取public修饰的名称为getSum的参数为两个int类型的方法,私有化报错
        /*Method method2=c.getMethod("getSum", int.class, int.class);
        System.out.println();*/
        // 获取public修饰的名称为my2CharArray的参数为String类型的方法
        Method method3=c.getMethod("my2CharArray", String.class);
        System.out.println(method3);



    }
}
